#!/usr/bin/perl -w
use strict;
use vars qw($USAGE);
use Carp;
use Getopt::Long;
use Bio::SeqIO;

$USAGE =
"get_seqs.pl\t[--db=DBNAME] [--format=FORMAT] \n\t\t[--output=FILENAME] [--proxy=PROXY] accession1, accession2, ...\n Defaults: db=GenBank format=fasta output=STDOUT proxy=none\n See LWP::UserAgent for more information on proxy syntax";
my %dbs = (
	'genbank'   => 'Bio::DB::GenBank',
	'embl'      => 'Bio::DB::EMBL',
	'swissprot' => 'Bio::DB::SwissProt',
);
my ( $db, $format, $file, $proxy, $help ) = ( 'genbank', 'fasta' );

&GetOptions(
	'db:s'              => \$db,
	'f|format:s'        => \$format,
	"file|out|output:s" => \$file,
	'proxy:s'           => \$proxy,
	"h|\?|help"         => \$help,
);

if ($help) { print $USAGE, "\n"; exit; }

if ( $db =~ /gb|gen|genbank/i ) {
	$db = 'genbank';
}
elsif ( $db =~ /embl|em|e/i ) {
	$db = 'embl';
}
elsif ( $db =~ /swiss|sp/i ) {
	$db = 'swissprot';
}
else {
	croak("Unknown db parameter '$db' valid parameters are ("
			. join( ',', keys %dbs )
			. ")" );
}

my %params = ( '-format' => $format );

if ( defined $file ) {
	$params{'-file'} = ">$file";
}
else {
	$params{'-fh'} = \*STDOUT;
}

my $seqio = new Bio::SeqIO(%params);

my $remotedb;

eval {
	my $filename = "$dbs{$db}.pm";
	$filename =~ s!::!/!g;
	require $filename;
	$remotedb = "$dbs{$db}"->new();
};

die($@) unless !$@;

if ( defined $proxy ) { $remotedb->proxy($proxy); }

my $stream;

if ( $remotedb->can('get_Stream_by_id') ) {
	$stream = $remotedb->get_Stream_by_id(@ARGV);
}
else {
	$stream = $remotedb->get_Stream_by_acc( \@ARGV );
}

while ( my $seq = $stream->next_seq ) {
	$seqio->write_seq($seq);
}
